extends Node2D

const SPEED = 200.0  # 箭矢飞行速度
const ARC_HEIGHT = 20.0  # 控制抛物线拱形高度

@onready var sprite_2d: Sprite2D = $Sprite2D

var start_position: Vector2  # 箭矢起始位置
var target_position: Vector2  # 箭矢目标位置
var moving: bool = false  # 是否正在移动
var time_passed: float = 0.0  # 飞行时间累积
var flight_duration: float  # 箭矢总飞行时间

# 发射箭矢，设置起始和目标位置
func shoot(arrow_start_point: Vector2, arrow_impact_point: Vector2) -> void:
	position = arrow_start_point  # 设置初始位置
	start_position = arrow_start_point  # 记录起始位置
	target_position = arrow_impact_point  # 记录目标位置
	flight_duration = start_position.distance_to(target_position) / SPEED  # 计算飞行总时长
	time_passed = 0.0  # 重置飞行时间
	moving = true  # 标记箭矢开始移动


# 在每帧更新位置和角度
func _process(delta: float) -> void:
	if not moving:
		return  # 不移动时直接返回
	time_passed = min(time_passed + delta, flight_duration)  # 累加经过时间，限制最大值为总飞行时间
	var t = time_passed / flight_duration  # 计算归一化时间 t (0 到 1)
	# x 坐标线性插值
	var x = lerp(start_position.x, target_position.x, t)  
	# y 坐标在线性插值的基础上，结合抛物线偏移
	var y = lerp(start_position.y, target_position.y, t) - ARC_HEIGHT * 4 * t * (1 - t)  
	position = Vector2(x, y)  # 更新箭矢当前位置
	# 计算角度：箭头对齐运动方向
	if t < 1.0:
		var next_position = Vector2(
			lerp(start_position.x, target_position.x, t + delta / flight_duration),
			lerp(start_position.y, target_position.y, t + delta / flight_duration) - ARC_HEIGHT * 4 * (t + delta / flight_duration) * (1 - (t + delta / flight_duration))
		)  # 计算下一帧位置
		sprite_2d.rotation = (next_position - position).angle()  # 设置箭矢角度朝向为曲线的切线方向
	# 到达目标后释放箭矢实例
	if t >= 1.0:
		queue_free()
